package com.smzd.ccms.complets;

import java.util.List;

import com.smzd.ccms.business.ChannelService;
import com.smzd.ccms.core.BaseCompletPlugin;
import com.smzd.ccms.core.ParamsWrapper;
import com.smzd.ccms.domain.Channel;

/**
 * 子栏目列表组件 为新闻或者新闻列表提供一个子栏目列表的功能组件。要求新闻或者新闻列表是二级栏目的内容。<br>
 * 适用的场景为，一级栏目A下有子栏目a1、a2、a3等子栏目，则列出栏目A或列出栏目a1的新闻条目页面是，
 * 都有可能要求同时列出子栏目列表。同样的，显示a2中的一篇新闻的时候，也可能会要求在页面上显示子栏目列表。 并极其有需求列出当前栏目列表或文章所属的子栏目。<br>
 * <br>
 * 配置的时候，如果是对于父级栏目，实际展示效果应该是其子栏目中的第一个为焦点，即其展示与第一个子栏目的展示效果相同，只是URL不同而已。<br>
 * 因此，在配置父级栏目的时候，需要额外指定两个参数：pChId和defSubChId，分别代表栏目A的id（即父级栏目Id，自己就是父级），
 * 和默认子栏目的ID。<br>
 * 如果是配置子栏目，则配置要简单的多，这两个参数都不需要配置，系统会通过URL的路径智能获取所处的子栏目列表。
 * 
 * @author YuZhongda
 * 
 */
public class SubchannelsComplet extends BaseCompletPlugin {
	ChannelService channelService;

	public SubchannelsComplet(int id) {
		super(id);
		channelService = ChannelService.getInstance();
	}

	@Override
	public String execute(ParamsWrapper params) throws Exception {
		if (channelService == null) {
			synchronized (this) {
				if (channelService == null) {
					channelService = ChannelService.getInstance();
				}
			}
		}
		List<Channel> channels;
		// 获取配置的父级栏目ID，可能不存在，这时要自己获取去
		Integer parentChId = params.getParamValue("pChId", 0);
		if (parentChId != null && parentChId > 0) {// 存在，太好了
			channels = channelService.getSubChannelsByParentId(parentChId);
		} else {
			String cPath = params.getModelParamValue("_channel_");
			String sPath = params.getModelParamValue("_site_");
			channels = channelService.getSublingChannelsByPath(sPath, cPath);
			if (channels != null && channels.size() > 0) {
				parentChId = channels.get(0).getParent().getId();
			}
		}
		params.put("_subchannels", channels);

		Channel parent = channelService.getItemById(parentChId);
		params.put("_parent", parent);

		Integer defChId = params.getParamValue("defSubChId", 0);
		boolean setFlag = false;
		if (defChId != null && defChId > 0) {
			for (Channel ch : channels) {
				if (ch.getId() - defChId == 0) {
					params.put("_channel", ch.getPath());
					setFlag = true;
					break;
				}
			}
		}
		if (!setFlag) {
			params.put("_channel", params.getModelParamValue("_channel_"));
		}
		return params.getParamValue("view", "ch-art.ftl");
	}
}
